package com.qingzhuge.common;

import net.sf.cglib.beans.BeanCopier;
import net.sf.cglib.core.Converter;

import java.io.Serializable;

/**
 * @author : zero.xiao
 * @description : DTO 基类
 * @date :2019-04-15 16:08
 * @modified :
 * 对象转换接口，将DTO对象转为数据bean对象，将bean对象转为DTO对象
 */
public interface DtoConverter extends Serializable {

    /**
     * 将DTO对象转为数据bean对象
     * @param dto DTO 源对象
     * @param bean bean 目标类型
     * @return bean 对象
     */
    default <B,D> B doForward(D dto,Class<B> bean){
        return getEntity(dto,bean);
    }

    /**
     * 将bean对象转为DTO对象
     * @param bean bean 对象
     * @param dto bean 目标类型
     * @return DTO 源对象
     */
    default <B,D> D doBackward(B bean,Class<D> dto){
        return getEntity(bean,dto);
    }

    /**
     * 转换对象，并复制属性
     * @param input 数据源
     * @param clz 目标类型
     * @param <T> 目标类型
     * @return 目标对象
     */
    default <T> T getEntity(Object input,Class<T> clz){
        T newInstance = null;
        if (null != input && null != clz){
            try {
                newInstance = clz.newInstance();
                BeanCopier copier = BeanCopier.create(input.getClass(), clz, true);
                copier.copy(input,newInstance, CONVERTER);
            } catch (InstantiationException | IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return newInstance;
    }

    Converter CONVERTER = new Converter(){

        @Override
        public Object convert(Object value, Class target, Object context) {
            return value;
        }
    };
}
